/*
 * Copyright (c) 2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.wso2.carbon.registry.social.api.people.userprofile.model;

import java.util.Date;

public interface Organization {

    /**
     * An Enumeration of field names for Organization.
     */
    public static enum Field {
        /**
         * the name of the address field.
         */
        ADDRESS("address"),
        /**
         * the name of the description field.
         */
        DESCRIPTION("description"),
        /**
         * the name of the endDate field.
         */
        END_DATE("endDate"),
        /**
         * the name of the field field.
         */
        FIELD("field"),
        /**
         * the name of the name field.
         */
        NAME("name"),
        /**
         * the name of the salary field.
         */
        SALARY("salary"),
        /**
         * the name of the startDate field.
         */
        START_DATE("startDate"),
        /**
         * the name of the subField field.
         */
        SUB_FIELD("subField"),
        /**
         * the name of the title field.
         */
        TITLE("title"),
        /**
         * the name of the webpage field.
         */
        WEBPAGE("webpage"),
        /**
         * the name of the type field, Should have the value of "job" or "school" to be put in the right
         * js fields.
         */
        TYPE("type"),
        /**
         * the name of the primary field.
         */
        PRIMARY("primary");

        /**
         * the name of this field.
         */
        private final String jsonString;

        /**
         * Construct a field based on the name of the field.
         *
         * @param jsonString the name of the field
         */
        private Field(String jsonString) {
            this.jsonString = jsonString;
        }

        /**
         * @return a string representation of the enum.
         */
        @Override
        public String toString() {
            return this.jsonString;
        }
    }

    /**
     * Get the address of the organization, specified as an Address. Container support for this field
     * is OPTIONAL.
     *
     * @return the Address of the organization
     */
    Address getAddress();

    /**
     * Set the address of the organization, specified as an Address. Container support for this field
     * is OPTIONAL.
     *
     * @param address the address of the organization
     */
    void setAddress(Address address);

    /**
     * Get a description or notes about the person's work in the organization, specified as a string.
     * This could be the courses taken by a student, or a more detailed description about a
     * Organization role. Container support for this field is OPTIONAL.
     *
     * @return a description about the persons work in the organization
     */
    String getDescription();

    /**
     * Set a description or notes about the person's work in the organization, specified as a string.
     * This could be the courses taken by a student, or a more detailed description about a
     * Organization role. Container support for this field is OPTIONAL.
     *
     * @param description a description about the persons work in the organization
     */
    void setDescription(String description);

    /**
     * Get the date the person stopped at the organization, specified as a Date. A null date indicates
     * that the person is still involved with the organization. Container support for this field is
     * OPTIONAL.
     *
     * @return the date the person stopped at the organization
     */
    Date getEndDate();

    /**
     * Set the date the person stopped at the organization, specified as a Date. A null date indicates
     * that the person is still involved with the organization. Container support for this field is
     * OPTIONAL.
     *
     * @param endDate the date the person stopped at the organization
     */
    void setEndDate(Date endDate);

    /**
     * Get the field the organization is in, specified as a string. This could be the degree pursued
     * if the organization is a school. Container support for this field is OPTIONAL.
     *
     * @return the field the organization is in
     */
    String getField();

    /**
     * Set the field the organization is in, specified as a string. This could be the degree pursued
     * if the organization is a school. Container support for this field is OPTIONAL.
     *
     * @param field the field the organization is in
     */
    void setField(String field);

    /**
     * Get the name of the organization, specified as a string. For example, could be a school name or
     * a job company. Container support for this field is OPTIONAL.
     *
     * @return the name of the organization
     */
    String getName();

    /**
     * Set the name of the organization, specified as a string. For example, could be a school name or
     * a job company. Container support for this field is OPTIONAL.
     *
     * @param name the name of the organization
     */
    void setName(String name);

    /**
     * Get the salary the person receives from the organization, specified as a string. Container
     * support for this field is OPTIONAL.
     *
     * @return the salary the person receives
     */
    String getSalary();

    /**
     * Set the salary the person receives from the organization, specified as a string. Container
     * support for this field is OPTIONAL.
     *
     * @param salary the salary the person receives
     */
    void setSalary(String salary);

    /**
     * Get the date the person started at the organization, specified as a Date. Container support for
     * this field is OPTIONAL.
     *
     * @return the start date at the organization
     */
    Date getStartDate();

    /**
     * Set the date the person started at the organization, specified as a Date. Container support for
     * this field is OPTIONAL.
     *
     * @param startDate the start date at the organization
     */
    void setStartDate(Date startDate);

    /**
     * Get the subfield the Organization is in, specified as a string. Container support for this
     * field is OPTIONAL.
     *
     * @return the subfield the Organization is in
     */
    String getSubField();

    /**
     * Set the subfield the Organization is in, specified as a string. Container support for this
     * field is OPTIONAL.
     *
     * @param subField the subfield the Organization is in
     */
    void setSubField(String subField);

    /**
     * Get the title or role the person has in the organization, specified as a string. This could be
     * graduate student, or software engineer. Container support for this field is OPTIONAL.
     *
     * @return the title or role the person has in the organization
     */
    String getTitle();

    /**
     * Set the title or role the person has in the organization, specified as a string. This could be
     * graduate student, or software engineer. Container support for this field is OPTIONAL.
     *
     * @param title the title or role the person has in the organization
     */
    void setTitle(String title);

    /**
     * Get a webpage related to the organization, specified as a string. Container support for this
     * field is OPTIONAL.
     *
     * @return the URL of a webpage related to the organization
     */
    String getWebpage();

    /**
     * Get a webpage related to the organization, specified as a string. Container support for this
     * field is OPTIONAL.
     *
     * @param webpage the URL of a webpage related to the organization
     */
    void setWebpage(String webpage);

    /**
     * Get the type of field for this instance, usually used to label the preferred function of the
     * given contact information. The type of organization, with Canonical Values <em>job</em> and
     * <em>school</em>.
     *
     * @return the type of the field
     */
    String getType();

    /**
     * Set the type of field for this instance, usually used to label the preferred function of the
     * given contact information. The type of organization, with Canonical Values <em>job</em> and
     * <em>school</em>.
     *
     * @param type the type of the field
     */
    void setType(String type);

    /**
     * Get Boolean value indicating whether this instance of the Plural Field is the primary or
     * preferred Organization.
     *
     * @return true if this is a primary or preferred value
     */
    Boolean getPrimary();

    /**
     * Set Boolean value indicating whether this instance of the Plural Field is the primary or
     * preferred Organization.
     *
     * @param primary true if this is a primary or preferred value
     */
    void setPrimary(Boolean primary);

}
